import os
from datetime import timedelta
from pathlib import Path

# import jewelry.models

BASE_DIR = Path(__file__).resolve().parent.parent

BASE_URL = 'https://21c04fe6.r6.cpolar.top'

SECRET_KEY = 'django-insecure-@rkkasrj^)-wj!x=14=xrd-i64&2r41w*^6&3tqk@u3h2u=f(m'

DEBUG = True  # 正式环境必须关闭
ALLOWED_HOSTS = ['*']  # '*'表示可以允许任何外网访问, 生产环境需指定域名

# 静态文件配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static', ]  # (开发环境)添加静态目录,也可写成: [BASE_DIR / 'static']
# STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')    # (生产环境)收集静态目录.staticfiles应该是static,以后再试

# 媒体文件配置
MEDIA_URL = '/media/'  # 访问URL前缀
MEDIA_ROOT = BASE_DIR / 'media'  # 等于: MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 文件存储根目录(包括图片)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'jewelry.apps.JewelryConfig',  # 珠宝
    'account.apps.AccountConfig',  # 后端用户登录与权限管理
    'ecom.apps.EcomConfig',        # 后端电商管理
    'rest_framework',
    'rest_framework_simplejwt',
    'rest_framework_simplejwt.token_blacklist',  # 必须添加
    'rest_framework.authtoken',  # token表
    'corsheaders',
    'channels',  # Websocket
    'imagekit',  # 缩略图用
    'ckeditor',  # 富文本V4
    'ckeditor_uploader',  # 富文本V4
    # 'django_ckeditor_5',   # 富文本V5
    'mptt',
]

# CKEditor配置:富文本
CKEDITOR_UPLOAD_PATH = 'uploads/'  # 上传文件存储子目录
CKEDITOR_IMAGE_BACKEND = "pillow"  # 图片处理引擎
CKEDITOR_CONFIGS = {
    'default': {
        'toolbar': 'Full',  # 完整工具栏
        'height': 300,  # 编辑器高度
        'filebrowserUploadUrl': '/ckeditor/upload/',  # 上传接口
        'extraPlugins': 'uploadimage'  # 启用图片上传插件
    }
}
SILENCED_SYSTEM_CHECKS = ['ckeditor.W001']  # 屏蔽富文本警告提示，因为V4版本已经停住维护了

# 安全增强措施 JWT 认证
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',  # 使用手机号登录用，确保使用Token认证 API 调用用
        # 'rest_framework.authentication.TokenAuthentication',  # 确保使用Token认证 API 调用用
        # 'rest_framework.authentication.SessionAuthentication',  # 启用Session支持,依靠会话
    ],
    # 'DEFAULT_PAGINATION_CLASS': 'jewelry.pagination.PageNumberPagination',  # 标准分页,固定死了,不灵活
    'DEFAULT_PAGINATION_CLASS': 'jewelry.pagination.StandardPagination',  # 自定义分页,配合自己设置灵使用活
    'PAGE_SIZE': 10,  # 默认每页显示的条数
    # 所有列表视图都会自动支持过滤功能:
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    # 获取头像昵称时认证可能需要加以下这句: 访问需要提供令牌,有时间再完善
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',  # 设为允许所有请求，然后需要权限的地方在views里加permission_classes = [IsAuthenticated]即可
        # 'rest_framework.permissions.IsAuthenticated',
        # 所有接口默认需认证, 需提前配置 authentication_classes（如 Token 认证‌），否则无法识别用户身份‌
    ],
    # 以下为快递100物流跟踪用
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/hour',
        'user': '1000/hour'
    },
    # ####################### 物流完毕 ##############

}

# JWT配置
JWT_AUTH = {
    'JWT_SECRET_KEY': os.getenv('SECRET_KEY'),  # 必须与签发端一致
    'JWT_ALGORITHM': 'HS256',
    'JWT_ALLOW_REFRESH': True,  # 允许客户端定期刷新Token，避免因设备切换导致会话失效
    'JWT_LEEWAY': 60,  # 时间容错阈值（秒）
    'JWT_EXPIRATION_DELTA': timedelta(days=7),
    'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30),
}

# HTTPS 强制启用
# SECURE_SSL_REDIRECT = True
# SESSION_COOKIE_SECURE = True
# CSRF_COOKIE_SECURE = True

MIDDLEWARE = [
    'middleware.cors.CorsMiddleware',  # 必须放在首位(自定义的中间件,处理跨域或OPTIONS)
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',  # 在前
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # 在后,依赖Session
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',  # 跨域中间件
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'account.middleware.URLAccessMiddleware',  # account的访问权限中间件(URL)
    'account.middleware.CustomStatusMiddleware',  # account的访问权限中间件:逻辑对的控制台错误,不让其显示(像400,401,403等)
]

AUTHENTICATION_BACKENDS = [
    # 'django.contrib.auth.backends.ModelBackend',  # Django默认的认证后端，默认用户名认证,因底下自定义有了,可以去掉
    'account.backends.UsernameMobileAuthBackend',  # 用户名/手机号登录时,同时验证
]

# 定义项目的根URL路由入口(主路由)
ROOT_URLCONF = 'payment.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR / 'templates',  # 项目级模板目录
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',  # 上下文处理器
                'django.contrib.messages.context_processors.messages',
                'ecom.context.ecom.banners.context_processors.products_context',  # 上下文处理器（获取商品列表）
            ],
        },
    },
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# 密码策略
AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 8}},
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
    {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', },
]

LANGUAGE_CODE = 'zh-hans'

# 启用时区支持
USE_TZ = True
# 设置默认时区（上海为例）
TIME_ZONE = 'Asia/Shanghai'
# 国际化语言自动翻译功能
USE_I18N = False          # 关闭国际化系统
USE_L10N = False          # 关闭本地化（日期/数字格式）为True,则标点符号为中文,那么django会识别出错

# 主键类型,未指定的话,这里起作用,但老版本3.2以前默认是整型AutoField,3.2版本以后是64位BigAutoField
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# ########### 微信支付资料 #######################
WECHAT_APPID = 'wx1c4068177526fbae'  # '小程序AppID': 好家猫微商城
APP_SECRET = '0c6c78c640e097cf1279a7296e2aaa39'  # 小程序密钥: 好家猫微商城
WECHAT_MCHID = '1227281402'  # '商户号': 上海御猫王服饰有限公司
WECHAT_API3_KEY = '20040125ZYFZWD20040125zyfzwd3232'  # 'APIv3密钥'
WECHAT_API2_KEY = '20040125ZYFZWD20040125zyfzwd3232'  # 'APIv2密钥'
WECHAT_SERIAL_NO = '69ED4F1459EA39511A23094272D8C1DA8621F478'  # '证书序列号'
WECHAT_PRIVATE_KEY = open('cert_dir/apiclient_key.pem').read()  # 私钥
WECHAT_CERT = open('cert_dir/apiclient_cert.pem').read()  # 公钥
WECHAT_NOTIFY_URL = BASE_URL + '/'  # V2和V3版本回调通知地址+自己的函数去读取执行
CERT_DIR = 'cert_dir/'  # 微信支付证书存放目录

# ########### 腾讯云短信应用的 app_id #######################
TENCENT_SMS_APP_ID = 1400938122
# 腾讯云短信应用的 app_key
TENCENT_SMS_APP_KEY = "8e7d2ef98b5630e7d06fdf871d6cb04e"
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "好家猫公众号"
TENCENT_SMS_TEMPLATE = {'register': 2269489, 'login': 2269488}
# ####################################################################

# 用于用户分组,权限等管理，顶替掉原生的User
AUTH_USER_MODEL = 'jewelry.UserInfo'

import logging

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'INFO',  # 设置日志级别
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.server': {
            'handlers': ['console'],
            'level': 'ERROR',  # 将日志级别设置为 ERROR，隐藏 INFO 级别的请求日志
            'propagate': False,
        },
    },
}

# JWT Token 的有效期为 15 天。
SIMPLE_JWT = {
    'SIGNING_KEY': SECRET_KEY,  # 必须与令牌生成方一致
    'ALGORITHM': 'HS256',
    'ACCESS_TOKEN_LIFETIME': timedelta(days=15),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
    'ROTATE_REFRESH_TOKENS': True,  # 每次刷新生成新 Refresh Token
    'BLACKLIST_AFTER_ROTATION': True,  # 旧 Refresh Token 加入黑名单
    'USER_ID_FIELD': 'id',
    'AUTH_HEADER_TYPES': ('Bearer',),
    # 'TOKEN_OBTAIN_SERIALIZER': 'account.serializers.CustomTokenSerializer',
    'TOKEN_OBTAIN_SERIALIZER': 'jewelry.serializers.CustomTokenObtainPairSerializer',  # 后端用户登录与权限序列化器
    'TOKEN_REFRESH_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenRefreshSerializer',
}

WSGI_APPLICATION = 'payment.wsgi.application'
# Websocket
ASGI_APPLICATION = 'payment.asgi.application'

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
    },
}

# ‌临时豁免CSRF
CSRF_TRUSTED_ORIGINS = [
    BASE_URL,
    'https://localhost:8000',
    'http://192.168.2.6:8000'
]
CSRF_COOKIE_SECURE = False  # 非HTTPS环境关闭安全传输

# 设置redis
CACHES = {
    'payment': {  # 这里设置成payment是给微信支付用
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://:1234@127.0.0.1:6379/1',
        # 1234是密码,在redis的路径C:\Program Files\Redis\redis.windows-service.conf配置,liux不同是redis.conf
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'SOCKET_CONNECT_TIMEOUT': 5,
            'SOCKET_TIMEOUT': 5,
        }
    },
    "default": {  # 这里设置成default默认
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:1234@127.0.0.1:6379/1",  # 格式：redis://[:密码]@主机:端口/数据库编号
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "SOCKET_CONNECT_TIMEOUT": 5,  # 连接超时（秒）
            "SOCKET_TIMEOUT": 5,  # 读写超时（秒）
            "IGNORE_EXCEPTIONS": True,  # 忽略 Redis 异常（避免服务中断）
            "PASSWORD": "your_password",  # 如果 Redis 需要密码
        },
        "KEY_PREFIX": "myapp_"  # 缓存键前缀（可选）
    }
}
# 可选：将 Session 存储到 Redis
# SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# SESSION_CACHE_ALIAS = "default"

# SESSION_ENGINE = "jewelry.models.CustomSession"  # CustomSession 老要出错,暂不用,会话记录
# SESSION_COOKIE_AGE = 86400 * 7  # 会话有效期7天

# Django 跨域配置示例（django-cors-headers）
CORS_ALLOW_HEADERS = [
    'authorization',  # 允许传递 Authorization 头
    'content-type',
    'x-requested-with',  # 放行ajax请求
]
CORS_EXPOSE_HEADERS = ['authorization']  # 暴露该头给前端‌

# 富文本类型支持配置
FILE_UPLOAD_PERMISSIONS = 0o644
FILE_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024  # 10MB

# 登录设置
# LOGIN_URL = '/accounts/login/'  # 根据实际路由修改
# LOGIN_REDIRECT_URL = '/'  # 登录成功后跳转到此路径
# LOGOUT_REDIRECT_URL = 'index/'  # 登出后跳转到首页

# 增大内存允许的文件大小（默认2.5MB）
DATA_UPLOAD_MAX_MEMORY_SIZE = 20 * 1024 * 1024  # 20MB

# 确保文件上传处理器启用
FILE_UPLOAD_HANDLERS = [
    'django.core.files.uploadhandler.MemoryFileUploadHandler',
    'django.core.files.uploadhandler.TemporaryFileUploadHandler'
]
